Skip to content

feat(npu): support CANN 9.1 MegaMoe for Qwen3.5#1989

Draft
pjgao wants to merge 8 commits into
xLLM-AI:mainfrom
pjgao:feat/cann91-megamoe-qwen35
Draft

feat(npu): support CANN 9.1 MegaMoe for Qwen3.5#1989
pjgao wants to merge 8 commits into
xLLM-AI:mainfrom
pjgao:feat/cann91-megamoe-qwen35

Conversation

@pjgao

@pjgao pjgao commented Jul 21, 2026

Copy link
Copy Markdown
Collaborator

背景与目标

Qwen3.5-35B-A3B 是 MoE 模型。原有 NPU FusedMoE 路径将专家路由、跨 rank token dispatch、专家 FFN、激活和 combine 拆成多个阶段,带来额外的 kernel launch、中间张量读写以及通信与计算衔接开销。

CANN 9.1 ops-transformer 提供 MegaMoe,将 MC2 通信与专家 FFN 组合到统一算子路径。本 PR 将该算子接入 xLLM,为 A3 上的 Qwen3.5 decode 优化提供基础,同时保留不满足能力条件时的原有 FusedMoE fallback。

接入方案

1. 配置与能力判断

  • 增加 MegaMoe 配置开关和 kernel 配置解析。
  • mega_moe_policy 中集中检查平台、模型、dtype、shape、EP 拓扑和算子可用性。
  • EP size 不硬编码为 16;只要 EP 为正数、能够整除专家数且满足算子约束,即可进入 MegaMoe 路径。
  • 未通过能力检查时继续使用原有 FusedMoE 实现。

2. ProcessGroup 级通信资源

  • 新增 MegaMoeCommResource,由 NPU ProcessGroup 管理 KFC/HCCL context、远端 window 和拓扑信息。
  • 通信资源按通信域复用,避免每层重复初始化 communicator。
  • 初始化时校验 rank、buffer span、对齐和边界。
  • KFC context 在初始化后保持只读,可由多层复用;forward 不再增加跨层 launch fence。

3. ACL 算子适配

  • 增加 MegaMoe ACL contract,调用 aclnnMegaMoeGetWorkspaceSizeaclnnMegaMoe
  • 明确可选输入、输出顺序、top-k dtype、权重 shape 和 topology 参数。
  • 校验 workspace 和 execute 符号必须来自同一份 MegaMoe vendor,避免标准 OPP 与外置 vendor 的 ABI 混用。

4. FusedMoE 运行时接入

  • fused_moe 根据 policy 选择 MegaMoe 或原有 fallback。
  • mega_moe_runtime 整理本地专家权重、输入、FP32 top-k 权重、通信 context 和输出张量。
  • 支持 attention data parallelism 与 expert parallelism 组合。
  • 空 DP/EP shard 使用一致的 synthetic-token metadata 参与 collective,避免各 rank tensor length 不一致。

定位过程中遇到的问题与解决方法

问题 根因 解决方法
Qwen3.5 shape 被 tiling 拒绝 Qwen3.5 的 intermediate_hidden=512,A2/A3 共用检查误用了 A2 的 1024 下界 ops-transformer !8966 按 SoC 选择下界:A3 支持 512,A2 保持 1024
只能使用 EP16 policy 把一次验证配置固化成能力限制 改为按专家数、EP size 和算子约束判断,支持 EP8/EP16 等合法配置
attention DP + EP 下 collective shape 不一致 空 shard 仍需参与 collective,但 synthetic token 与线性注意力 metadata 不一致 统一空 shard token、序列长度、state id 和全局 token count
远端通信 buffer 越界风险 window span 校验未覆盖全部 rank 与实际 payload 按实际布局计算 span,并在资源初始化阶段逐 rank 校验
EP8 输出跨轮次不一致 top-k 权重精度和空 shard metadata 修复曾与 launch fence 打包,导致根因被混淆 保留 FP32 top-k 与空 shard 修复;用同二进制 fence/none A/B 证明 fence 与精度无关并删除 fence
首个真实请求断连 8 个 worker 并发首次注册同名 Triton RMSNorm kernel,7 个线程收到 ACL_ERROR_RT_KERNEL_DUPLICATE (507028) 依赖 torch-npu-ops #2,将 registry 的 lookup/register/publish 序列串行化
标准算子与外置 MegaMoe ABI 混用 动态符号可能从不同 vendor 解析 校验两个 ACL 符号的实际来源,并要求 MegaMoe vendor 位于 vendor 链首位

为什么删除 launch fence

旧实现假设下一层 host launch 会改写共享 KFC context,因此在同一通信资源的连续 MegaMoe 调用间记录 event,并在下一次调用前等待。

算子侧确认 KFC context 支持跨层复用。代码检查也表明 context 仅在资源初始化时写入,forward 只读传递 context tensor。受控实验进一步验证:

  • 同一 binary 下,fencenone 的 579 smoke 全文 hash 相同;
  • fence 的 24 个并发短输出一致;
  • 两个独立冷启动的 none 服务共 48 个并发短输出一致;
  • 删除 fence 后的两个正式 binary 再完成 48 个并发短输出,仍全部一致。

因此 fence 不是精度修复。删除它同时去掉每层 event 记录、下一层 event wait 和同 communicator 的 host launch 串行化。本文不据此声明具体性能增益,性能数字仍应由独立 profiler/benchmark 给出。

代码改动规模与分布

当前 PR 相对 main 修改 37 个文件,新增 3283 行、删除 15 行,净增 3268 行

模块 文件数 新增 删除 主要内容
聚焦测试 8 1084 0 配置、通信资源、ACL contract、policy 与 runtime 测试
通信资源 7 700 3 ProcessGroup 生命周期、KFC/HCCL context、buffer span
ACL 与 kernel 适配 8 519 0 ACL contract、符号来源、workspace/execute 与参数定义
FusedMoE 与运行时 9 937 9 分流、权重整理、FP32 top-k、空 shard metadata、worker 接入
配置与策略 3 40 0 配置开关与 kernel 配置解析
submodule 配置与 gitlink 2 3 3 GitHub 地址与 torch-npu-ops #2 固定 commit
合计 37 3283 15 净增 3268 行

依赖关系

  1. ops-transformer !8966,commit 2d281a246f438d026b277319b3126ba430f9ae8a:提供 A3 MegaMoe intermediate_hidden=512 的 host tiling 支持。
  2. torch-npu-ops #2,commit 21cab2b6af14f18f56b7453024319065c8fb9764:修复多 worker 首次懒注册竞态。本 PR 的 gitlink 已固定到该 commit,应先合入 doc: update readme acknowledgment. #2

本接入不依赖 xllm-ops 的 DispatchFFNCombine 修改。

验证环境

项目 版本或配置
硬件 Atlas A3,Ascend 910,SoC target ascend910_93,EP8 使用 8 张 NPU,每张 64 GiB HBM
NPU 驱动工具 npu-smi 26.0.rc1
操作系统 openEuler 24.03 LTS-SP2,aarch64
CANN 9.1.0-beta.3,OPP 构建时间戳 20260616_185108448
ATB 9.0.0,commit 7a8ae13c16daf1a2179d7520e71e6b21445f3b2f
Python 3.11.15
PyTorch 2.9.0+cpu
torch_npu 2.9.0.post2
transformers 5.10.1
tokenizers 0.22.2
safetensors 0.7.0
NumPy 1.26.4
GCC 12.3.1
CMake 3.27.9
模型 Qwen3.5-35B-A3B
并行配置 DP8 / EP8
已验证 xLLM PR HEAD 73a7fe102a95a56209323d27a3e7b0b3eaaca583
torch-npu-ops 21cab2b6af14f18f56b7453024319065c8fb9764
验证 binary SHA256 e5dfadffe259920b6add5035908faf851347b571a652ef7f161647cf1a6287a7
OPP CANN 标准 OPP + 独立外置 MegaMoe vendor;MegaMoe vendor 位于 vendor 链首位

验证结果

聚焦测试与构建

  • MegaMoe policy、runtime、ACL contract、通信资源和空 shard metadata 聚焦测试通过。
  • ops-transformer MegaMoe op-host RED→GREEN:修复前 A3 512 shape 失败;修复后 12/12 通过,且 A2 仍拒绝 512。
  • build-gate3 正式 xLLM binary 增量构建通过;最终构建只重编 Triton adapter 的直接依赖并重链接 xLLM,未重复大范围产品构建。

KernelRegistry RED→GREEN

阶段 结果
RED API ready 后首个请求触发 RMSNorm kernel 并发注册;1 个成功、7 个报 507028,请求断连
GREEN 固定 torch-npu-ops #2 后不再出现 507028rtKernelLaunch failed,真实生成和 24 请求并发验证通过

EP8 服务级验证

检查项 结果
权重加载 8 个 worker 均完成 14 个分片加载,耗时合理
API ready 通过
真实生成 temperature=0,提示“只回答最终数字:123加456等于多少?”,结果包含 579
精确 commit 并发确定性 3 轮 × 8 请求,24/24 非空且输出 SHA256 完全一致
fence/none A/B fence 24/24;两个独立 none 冷启动合计 48/48;输出 hash 与 smoke hash 相同
无 fence 正式构建复验 两个正式 binary 合计 48/48 一致;最终 #2 精确 commit 为其中 24/24
运行时错误 未发现 HCCL、ACL、AICore、507028、非法内存访问或进程异常
进程状态 未出现 mmap/GUP D-state
清理 每轮结束后 API 关闭,使用的 NPU 全部释放

上述属于针对 MegaMoe 跨 rank 随机 token 和首次 kernel 注册竞态的服务级集成回归,不等同于完整 CEval/GSM8K 分数评测。

PR 范围

本 PR 只提交 MegaMoe 接入、EP/DP 适配、通信资源管理、ABI/shape 校验和精度相关运行时修复。机器相关权重加载适配不进入本 PR。

georgezhanglei85-eng pushed a commit to georgezhanglei85-eng/xllm that referenced this pull request Jul 21, 2026
georgezhanglei85-eng pushed a commit to georgezhanglei85-eng/xllm that referenced this pull request Jul 23, 2026
通信资源: MegaMoeCommResource + MegaMoeCommResourceSlot, ProcessGroup 持有
  - 单例符号加载, span 校验, 有界缓存
  - 无 LaunchFence (避免 pipeline 空泡)
  - hccl_comm() 返回 comm_, resolve_hccl_comm 名字反查 fallback

算子接入: npu_mega_moe.cpp + apply_npu_mega_moe()
  - 参照 npu_dispatch_ffn_combine.cpp 模式
  - has_mega_moe() 符号检查 + TORCH_CHECK 输入验证

权重缓存: 4 成员变量 + ensure_mega_moe_weights()
  - transpose+contiguous+select 一次构建
  - 无 padding (moe_tp_size=1, CANN 支持 intermediate=512)

路由: select_global_experts() 消除代码重复

Policy: bool enable_mega_moe + initialize_mega_moe() 构造时检查

config: kernel_config 新增 enable_mega_moe 开关
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant